package cn.uai.activiti8.approval.service.impl;

import cn.uai.activiti8.approval.bus.AbstractBusinessBus;
import cn.uai.activiti8.approval.service.DelegateProcessService;
import cn.uai.activiti8.approval.service.InfrastructureService;
import cn.uai.activiti8.cache.GlobalCache;
import cn.uai.activiti8.dto.Result;
import cn.uai.activiti8.service.UserService;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import jakarta.annotation.Resource;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

import static cn.uai.activiti8.enums.RoleEnum.ROLE_PURCHASER;

/**
 * @desc 委派任务实现类
 * @author uai
 * @since 2025/8/7 17:32
 * @version 1.0
 */
@Service
public class DelegateProcessServiceImpl extends InfrastructureServiceImpl implements DelegateProcessService {

    private static final Logger LOGGER = LoggerFactory.getLogger(DelegateProcessServiceImpl.class);

    private static final String PROCESS_DEFINITION_KEY = "delegate-process-v2-k";

    @Resource
    private UserService userService;

    @Resource
    private TaskService taskService;

    @Resource
    private InfrastructureService infrastructureService;

    @Override
    public ProcessInstance start(String body) {
        JSONObject bodyJson = JSON.parseObject(body);
        Map<String, Object> variables = new HashMap<>();
        Long uid = bodyJson.getLong("uid");
        Long rid = userService.findRidByUid(uid);
        dynamicAssignStartVariables(rid, variables);
        return infrastructureService.startByKey(PROCESS_DEFINITION_KEY, variables);
    }

    @Override
    public String complete(String body) {
        return super.complete(body);
    }

    /**
     * 委派，通过taskService原生接口实现
     * @param body
     * @return
     */
    @Override
    public String delegate(String body) {
        JSONObject bodyJson = JSONObject.parseObject(body);
        // 任务id
        String taskId = bodyJson.getString("taskId");
        // 委派人
        String delegatePersonnelUid = bodyJson.getString("uid");
        // 被委派人
        String appointedPersonnelUid = bodyJson.getString("toUid");

        // 第一步：委派人将任务拥有者设置为自己的userId，这个操作会将 act_ru_task 中的字段 OWNER_ 的值从 null 改为 委派人的 userId，表示任务拥有者是委派人。
        taskService.setOwner(taskId, delegatePersonnelUid);
        // 第二步：委派人将任务委派给被委派人，这个操作会将 act_ru_task 中的字段 ASSIGNEE_ 的值从 委派人的 userId 改为 被委派人的 userId，
        taskService.delegateTask(taskId, appointedPersonnelUid);
        return Result.success();
    }

    @Override
    public String completeDelegation(String body) {
        JSONObject bodyJson = JSONObject.parseObject(body);
        // 任务id
        String taskId = bodyJson.getString("taskId");
        // 被委派人完成委派任务前，需先解析任务，这个操作会将 act_ru_task 中的字段 DELEGATION_ 的值从 PENDING 改为 RESOLVED，表示委派已经操作完成。
        taskService.resolveTask(taskId);
        // 被委派人完成任务，任务自动流转到 委派人
        // 委派人并不需要去实际执行 complete 完成任务操作
//        taskService.complete(taskId, variables);
        return Result.success();
    }

    @Override
    public void dynamicAssignStartVariables(Object original, Map<String, Object> variables) {
        // 普通店员 给下一级设置变量
        variables.put("storeAssistants", "690028525338693");
    }

    @Override
    protected void dynamicAssignCompleteVariables(Object original, Map<String, Object> variables) {
        Long rid = (Long) original;
        if (ROLE_PURCHASER.getRid().equals(rid)) {
            // 采购员（店铺助理） 给下一级设置变量
            variables.put("storeManager", "681374462742597");
            variables.put("warehouseKeeper", "700661117624389");
        } else if (GlobalCache.PARALLEL_APPROVAL_ROLE.contains(rid)) {
            // 部门主管（店长）、仓管员、经理助理 给下一级设置变量
            variables.put("regionalManager", "681372686954565");
        }
    }
}
